package com.dd.cloud.user.service.pres;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dd.cloud.user.DTO.CallbackPresStatusReq;
import com.dd.cloud.user.DTO.CancelPresReq;
import com.dd.cloud.user.DTO.CommonParamReq;
import com.dd.cloud.user.DTO.hjt.SynchHjtPresReq;
import com.dd.cloud.user.entity.order.OrderPay;
import com.dd.cloud.user.entity.pres.PresBasics;
import com.dd.cloud.user.entity.pres.PresPrescription;
import com.dd.cloud.user.req.order.PayUnOrderReq;
import com.dd.cloud.user.req.pres.*;
import com.dd.cloud.user.res.order.PayOrderResponse;
import com.dd.cloud.user.res.pres.*;
import com.dd.cloud.user.vo.ExpressRes;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 处方表 服务类
 * </p>
 *
 * @author czg
 * @since 2022-04-27
 */
public interface IPresPrescriptionService extends IService<PresPrescription> {
    /**
     * 添加修改后的处方
     *
     * @param request
     * @param map
     * @return
     */
    PayOrderResponse<?> savePres(HttpServletRequest request, Map<String, Object> map);

    /**
     * 生成处方pdf
     *
     * @param tencode
     */
    void generatePresPdf(String tencode);

    /**
     * 处方退款回调
     *
     * @param pay
     */
    void refundPresCallback(OrderPay pay);

    /**
     * 医生审核无处方权处方
     *
     * @param req
     */
    void doctorReviewPres(DoctorReviewPresReq req);

    /**
     * 重新提交处方
     *
     * @param tencode
     */
    void reSubmitPres(String tencode);

    /**
     * 删除处方
     *
     * @param tencode
     */
    void updatePresStatus(String tencode);

    /**
     * 取消处方
     *
     * @param req
     */
    void cancelPres(CancelPresReq req);

    /**
     * 查询处方列表
     *
     * @param req
     * @return
     */
    IPage<PresPrescriptionPageRes> queryPresPrescriptionPage(PresPrescriptionPageReq req);

    /**
     * 查询处方列表联合处方草稿查询
     *
     * @param req
     * @return
     */
    IPage<PresPrescriptionHistoryPageRes> queryPresPrescriptionHistoryPage(PresPrescriptionPageReq req);

    /**
     * 获取处方详情
     *
     * @param tencode
     * @return
     */
    PresPrescriptionDetailRes getPresDetail(String tencode);

    /**
     * 通用处方状态流转接口
     *
     * @param req
     * @return
     */
    Object statusReport(CallbackPresStatusReq req);

    /**
     * 通用物流回调接口信息
     *
     * @param req
     * @return
     */
    Object expressCallback(CommonParamReq req);

    /**
     * 宏济堂药品对账结算
     *
     * @param req
     */
    void hjtReconciliation(SynchHjtPresReq req);

    /**
     * 查询处方订单信息h5
     *
     * @param tencode
     * @return
     */
    PresDetailH5Res queryPresDetailH5(String tencode);

    /**
     * 修改处方患者收货地址信息
     *
     * @param req
     */
    void updatePresPatientAddrInfo(PayUnOrderReq req);

    /**
     * 查询物流信息
     *
     * @param tencode
     * @return
     */
    List<ExpressRes> queryLogisticsInfo(String tencode);

    /**
     * 处理处方流转状态 药房后台
     *
     * @param req
     */
    void handlePresPharmacy(HandlePresPharmacyReq req);

    /**
     * 处方锁定库存
     */
    void checkPresDrugsStock(PresPrescription pres);

    /**
     * 解锁库存
     */
    void releasePresDrugsStock(PresPrescription pres, Integer type);

    /**
     * 扣减库存
     */
    void subQty(PresPrescription pres);

    /**
     * 是否有折扣
     *
     * @param doctorId
     * @param pharmId
     * @return Boolean
     */
    Boolean isCount(Integer doctorId, Integer pharmId);

    /**
     * 自动完成订单
     *
     * @param tencode
     */
    void presAutoComplete(String tencode);

    /**
     * 处方重新发送至药房
     */
    void sendPharAgain(String orderNo);

    void test();

    /**
     * 处方订单审核超时
     *
     * @param tencode
     */
    void presReviewTimeout(String tencode);

    /**
     * 患者在线问诊咨询时查询处方历史诊断
     */
    Page<PresPrescriptionMedPageRes> queryPresMedPage(PresPrescriptionMedPageReq req);

    /**
     * 问诊中处方订单支付成功通知消息
     *
     * @param tencode
     */
    void consultPresPaySuccess(String tencode);

    /**
     * 发送处方,诊断,病历,患者数据到监管平台
     */
    void sendDDataToSupervise();

    /**
     * 基础处方分页
     *
     * @param req
     * @return
     */
    Page<PresBasics> queryPresBasicPage(PresBasicReq req);

    /**
     * 创建订单
     * @param payType
     * @param tencode
     * @return
     */
    PayOrderResponse<?> addOrder(String openId,String tencode, String payType,HttpServletRequest request);

    /**
     * 审核签方
     * @param tencode
     */
    String signName(String tencode);

    /**
     * 保存药师开方
     * @param req
     */
    String savePharmacistsPres(PresPharmacistsReq req);

    /**
     * 生成订单
     * @param tencode
     */
    void addPharmacistsOrder(String tencode);
}
